package com.firefly.netty.demo;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @author King
 * @date 2021/7/14
 */
public class DataFrameDecoderBack extends ByteToMessageDecoder {

    /**
     * 帧     头	        长 度	    命 令	    参 数	            校验和
     * 0x55 0xAA	        2byte	    1byte	    0~1476bytes	        2bytes
     *
     * 长度 = 命令字 + 参数 + 校验和 ，不包括帧头和长度字节；
     * 校验和 = 帧头 + 长度 + 命令字 + 参数的字节累加和。
     *
     */

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 起始数据
        byte[] startByte = new byte[8];
        in.readBytes(startByte);
        // 长度位
        byte[] lengthByte = new byte[4];
        in.readBytes(lengthByte);
        String l = "";
        for (byte b : lengthByte) {
            String t = Character.toString(b);
            l+=t;
        }
        Integer length = Integer.valueOf(l);
        System.out.println("length----" + length);
        // 参数
        int endLength = length - 5;
        byte[] endByte = new byte[endLength];
        in.readBytes(endByte);
        System.out.println(endLength);
        // 所有数据组合到一起
        byte[] all = new byte[startByte.length+lengthByte.length+endByte.length];
        System.arraycopy(startByte, 0, all, 0, startByte.length);
        System.arraycopy(lengthByte, 0, all, startByte.length, lengthByte.length);
        System.arraycopy(endByte, 0, all, startByte.length + lengthByte.length, endByte.length);
        String outMsg = "";
        for (byte b : all) {
            String t = Character.toString(b);
            outMsg+=t;
        }
        System.out.println(outMsg);
        // 输出结果
        out.add(outMsg);
    }
}
